package roles;

import java.util.ArrayList;
import java.util.Random;

import model.Case;
import model.Fourmiliere;
import model.Terrain;
import etresVivant.Fourmi;

public class Ouvriere extends Role {

	/**
	 * une liste de case necessaire pour le retour au nid.
	 */
	private ArrayList<Case> chemin = new ArrayList<>();
	
	/**
	 * quantite de pheromone de chasse deposee par une fourmi ouvriere sur une case.
	 */
	private final int PHEROMONE_CHASSE = 10000;

	public Ouvriere() {
		minEsperanceVie = 1.5f * 360.0f;
		maxEsperanceVie = 2.5f * 360.0f;
		minPoids = 1.5f;
		maxPoids = 2.0f;
		bOuvriere = 1;
	}

	@Override
	public Object actions(Fourmiliere f, Fourmi ouvriere) {
		chasse(f, ouvriere);
		entretient(f);
		return null;
	}

	/**
	 * entretenir la fourmiliere en nettoyant les cadavres.
	 * @param la fourmiliere f
	 */
	private void entretient(Fourmiliere f) {
		int pourcent30pop =  f.getFourmis().size();
		pourcent30pop = (pourcent30pop * 30) / 100; // 30% de la population de la fourmiliere
		int nbCadavres = 2;
		// tant que le nombre de cadavres de fourmis dans la fourmiliere est
		// superieur a 30% de la population active de la fourmiliere.
		while ( f.getCadavres().size() > pourcent30pop ){
			Fourmi cadavre = f.setCadavresRemove();
			f.setDepotAdd(cadavre);
			nbCadavres--;
		}
		// fait au moins son taux de menage.
		for (int i = 0; nbCadavres > 0 && i < f.getCadavres().size(); i++) {
			Fourmi cadavre = f.setCadavresRemove();
			f.setDepotAdd(cadavre);
			nbCadavres--;
		}
	}

	/**
	 * la fourmi sort du nid en cherchant de la nourriture.
	 * Quand elle tombe dessus elle ramene la proie au stock
	 * et elle se met a entretenir la fourmiliere.
	 * @param la fourmiliere f
	 */
	private void chasse(Fourmiliere fourmiliere, Fourmi f) {
		deplacerOuvriere(f);
		if (f.getCase().isProie()) {
			Case c = f.getCase();
			float poids = c.getProie().getPoids();
			Terrain.removeProie(c);
			c.setProie(false);
			c.getProie().meurt();
			c.setProieLibre(null);
			fourmiliere.ajoutAuStock(poids);
			rentreAuNid(f);
		}
	}

	/**
	 * depose un pheromone de chasse sur la case correspondante à la fourmi en paramètre.
	 * @param une fourmi ouvriere
	 */
	public void deposerPheromoneChasse(Fourmi ouvriere) {
		ouvriere.getCase().setPheromoneChasse(PHEROMONE_CHASSE);
	}

	/**
	 * deplace une fourmi ouvriere au hasard en deposant des pheromones de chasse.
	 * @param une fourmi ouvriere
	 */
	public void deplacerOuvriere(Fourmi ouvriere) {
		chemin.add(ouvriere.getCase());
		ArrayList<Case> casesVoisines = new ArrayList<Case>();
		Random rd = new Random();
		casesVoisines = ouvriere.getCase().casesVoisines();
		for (Case c : casesVoisines) { // si une proie existe sur une case voisine on l'attaque.
			if (c.isProie()) {
				ouvriere.setCase(c);
				return;
			}
		} // sinon elle se deplace au hasard.
		int num = rd.nextInt(casesVoisines.size());
		ouvriere.setCase(casesVoisines.get(num));
		deposerPheromoneChasse(ouvriere);
	}
	
	/**
	 * elle fait rentrer la fourmi ouvriere au nid après avoir chasser
	 * en suivant la liste des cases ou elle est passee.
	 * @param une fourmi ouvriere
	 */
	public void rentreAuNid(Fourmi ouvriere) {
		ArrayList<Case> cheminClone = new ArrayList<Case>();
		cheminClone = chemin;
		for (int i=cheminClone.size()-1; i>=0; i--) {
			ouvriere.setCase(cheminClone.get(i));
			chemin.remove(i);
		}
	}

	@Override
	public String monRole() {
		return "Ouvriere";
	}

}
